package com.powergame.model;

import com.powergame.exceptions.PowerGameException;

/**
 * Ordre.java
 *
 * Modélise un ordre d'un joueur
 *
 * @author ToF
 */
public abstract class Ordre implements Runnable {
    
    public static final int EN_ATTENTE = 0;
    public static final int EXECUTION_EN_COURS = 1;
    public static final int TERMINE_OK = 2;
    public static final int TERMINE_ERREUR = 3;
    
    /** La feuille qui contient l'ordre */ 
    private FeuilleOrdres feuille = null;
    
    private int etat = EN_ATTENTE;
    
    public Ordre(FeuilleOrdres feuille){
        this.feuille = feuille;
    }

    public int getEtat() {
        return etat;
    }

    public void setEtat(int etat) {
        this.etat = etat;
    }

    public FeuilleOrdres getFeuille() {
        return feuille;
    }

    public void setFeuille(FeuilleOrdres feuille) {
        this.feuille = feuille;
    }
    
    public Joueur getJoueur(){
        return getFeuille().getJoueur();
    }
    
    public Jeu getJeu(){
        return getFeuille().getJoueur().getJeu();
    }
    
    public Plateau getPlateau(){
        return getFeuille().getJoueur().getJeu().getPlateau();
    }
    
    @Override
    public void run(){
        
        setEtat(EXECUTION_EN_COURS);
        
        try{
            execute();
            setEtat(TERMINE_OK);
            
        }catch(PowerGameException e){
            setEtat(TERMINE_ERREUR);
        }
    }
    
    /**
     * Méthode à implémenter par chaque type d'ordre
     */
    public abstract void execute() throws PowerGameException;
}
